package kr.co.bettersoft.waitnumbercustomer.common;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import kr.co.bettersoft.waitnumbercustomer.activity.R;
import kr.co.bettersoft.waitnumbercustomer.domain.BusinessKind;
import kr.co.bettersoft.waitnumbercustomer.domain.MemberUser;
import kr.co.bettersoft.waitnumbercustomer.domain.Merchant;
import kr.co.bettersoft.waitnumbercustomer.domain.MerchantSearchOption;
import kr.co.bettersoft.waitnumbercustomer.domain.WaitNumberEvent;
import kr.co.bettersoft.waitnumbercustomer.domain.WaitingRecommendation;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.util.Log;
/**
 * 서버와 통신하는 부분을 별도로 분리하여 관리하는 클래스이다.
 * @author blue
 *
 */
public class WaitNumberCustomerRest {
	String TAG = "WaitNumberCustomerRest";

	// 서버 통신
	int responseCode = 0;
	String controllerName ="";
	String methodName ="";
	String serverName = CommonConstant.serverNames;
	
	int isRunning = 0;		// 통신 도중 중복 호출을 방지하기 위함.
	String fullUrl = "";
	String inputJson = "";
	
	// 현 시각
	String nowDate;

	// 결과
	String callResult = "";
//	String tempstr = "";

	JSONObject jsonObject;
	JSONArray jsonArray;

	Context context;
	
//	// 고객 정보 저장
//	MemberUser memberUser = new MemberUser();
//	// 이벤트 정보 저장
//	WaitNumberEvent waitNumberEvent = new WaitNumberEvent();
//	// 가맹점 정보
//	Merchant merchant = new Merchant();
//	// 가맹점 리스트 조회용 검색 조건 정보
//	MerchantSearchOption merchantSearchOption;
//	// 업종 정보
//	BusinessKind businessKind;
	
//	// 별점 및 리뷰 정보
//	WaitingRecommendation waitingRecommendation = new WaitingRecommendation();
//	// 추천 리스트 정보
//	List<WaitingRecommendation> waitingRecommendationEntries;
//	List<WaitingRecommendation> waitingRecommendationEntriesFn;
//	// 업종 리스트
//	List<BusinessKind> businessKindList;
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 서버 통신

	/**
	 * RestCertificationStep_1
	 *  전화번호를 보내서 인증번호 4자리를 받아온다.
	 * @return  String
	 */
	public String RestCertificationStep_1(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingCertificationController";
		methodName = "requestCertification";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("phoneNumber", memberUserParam.getPhoneNumber());	
			obj.put("activateYn", "Y");
			obj.put("modifyDate", nowDate);
			obj.put("registerDate", nowDate);
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
			try {
				jsonObject = new JSONObject(callResult);
				callResult = jsonObject.getString("result").toString(); 
//				Log. d(TAG,"callResult:"+callResult);
			} catch (JSONException e) {
				callResult = "F";
				e.printStackTrace();
			} 
		}
		return callResult;
	}


	/**
	 * RestCertificationStep_2
	 *  전화번호, 인증번호 4자리를 보내서 승인을 받는다.
	 * @return  String
	 */
	public String RestCertificationStep_2(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingCertificationController";
		methodName = "requestAdmission";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("phoneNumber", memberUserParam.getPhoneNumber());			// 전번
			obj.put("certificationNumber", memberUserParam.getCertiNum());	// 승인번호		
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
			try {
				jsonObject = new JSONObject(callResult);
				callResult = jsonObject.getString("result").toString(); 
//				Log. d(TAG,"callResult:"+callResult);
			} catch (JSONException e) {
				callResult = "F";
				e.printStackTrace();
			} 
		}
		return callResult;
	}


	/**
	 * RestUserRegisterCheck
	 *  서버에 저장되어 있는지 확인. 
	 * @return  String
	 */
	public String RestUserRegisterCheck(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberController";
		methodName = "selectDuplicate";	
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("qrCode", memberUserParam.getPhoneNumber());
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);
		
		// 서버 호출 결과 처리는 외부에서.
		return callResult;
	}


	/**
	 * RestRegisterMemberToServer
	 *  서버에 멤버 가입 한다.
	 * @return  String
	 */
	public String RestRegisterMemberToServer(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberController";
		methodName = "registerMember";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("qrCode", memberUserParam.getPhoneNumber());
			obj.put("phoneNumber", memberUserParam.getPhoneNumber());
			obj.put("email", "");		 
			obj.put("registrationId", "");
			obj.put("receiveNotificationYn", "Y");
			obj.put("activateYn", "Y");
			obj.put("modifyDate", nowDate);
			obj.put("registerDate", nowDate);
			obj.put("deviceType", "AS");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
			try {
				jsonObject = new JSONObject(callResult);		
				try{
					callResult = (jsonObject.getString("result"));				 
				}catch(Exception e){
					callResult = "F";
				}
			} catch (JSONException e) {
				callResult = "F";
				e.printStackTrace();
			} 
		}
		return callResult;
	}


	/**
	 * RestGetEventDetail
	 *  이벤트 상세 정보를 가져온다.
	 * @return  String
	 */
	public String RestGetEventDetail(WaitNumberEvent waitNumberEventParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingEventController";
		methodName = "selectEventInformation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("idWaitingEvents", waitNumberEventParam.getIdWaitingEvents());
			obj.put("merchantId", waitNumberEventParam.getMerchantId());
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		return callResult;
	}

	/**
	 * RestGetMyEventList
	 *  이벤트 목록 가져온다
	 * @return  String
	 */
	public String RestGetMyEventList(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingEventController";
		methodName = "selectUserEventList";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("activateYn", "Y");
			obj.put("qrCode", memberUserParam.getQrCode());
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리

		return callResult;
	}


	/**
	 * RestUpdateMyGCMtoServer
	 *  서버에 gcm 아이디 업뎃한다
	 * @return  String
	 */
	public String RestUpdateMyGCMtoServer(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberController";
		methodName = "updateRegistrationId";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("qrCode", memberUserParam.getQrCode());	
			obj.put("activateYn", "Y");
			obj.put("registrationId", memberUserParam.getRegistrationId());							
			obj.put("modifyDate", nowDate);							
			obj.put("deviceType", "AS");			
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
			try {
				jsonObject = new JSONObject(callResult);
				callResult = jsonObject.getString("result").toString(); 
//				Log. d(TAG,"callResult:"+callResult);
			} catch (JSONException e) {
				e.printStackTrace();
				callResult="F";
			} 
		}
		return callResult;
	}


	/**
	 * RestGetUserMerchantInfo
	 *  대기 등록한 가맹점 정보를 가져온다.
	 * @return  String
	 */
	public String RestGetUserMerchantInfo(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingUserController";
		methodName = "selectUserMerchantInformation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("qrCode", memberUserParam.getQrCode());
			obj.put("admissionYn", "N");
			obj.put("activateYn", "Y");
			obj.put("registerDate", nowDate);	
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);
		Log.d(TAG, "callResult::"+callResult);
//		try{
//			// 서버 호출 결과 처리
//		}catch(Exception e){
//			e.printStackTrace();
//			callResult = "F";
//		}
		return callResult;
	}


	/**
	 * RestGetUserInfo
	 *  대기 등록한 가맹점 정보를 가져온다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestGetUserInfo(MemberUser memberUserParam, Merchant merchantParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingUserController";
		methodName = "selectUserInformation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", merchantParam.getMerchantId());
			obj.put("qrCode", memberUserParam.getQrCode());	// idWaitingUsers --> qrCode 로 바뀜. 
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

//		try{
//			// 서버 호출 결과 처리
//			if(!(callResult.equals("F"))){
//				jsonObject = new JSONObject(callResult);
//				try{
//					merchant.setMerchantId(jsonObject.getString("merchantId"));
//				}catch(Exception e){
//					merchant.setMerchantId("");
//				}
//				try{
//					merchant.setNumberWaiting(jsonObject.getString("numberWaiting"));
//				}catch(Exception e){
//					merchant.setNumberWaiting("");
//				}
//				try{
//					merchant.setCompanyName(jsonObject.getString("companyName"));
//				}catch(Exception e){
//					merchant.setCompanyName("");
//				}
//				try{
//					merchant.setWorkPhoneNumber(jsonObject.getString("workPhoneNumber"));
//				}catch(Exception e){
//					merchant.setWorkPhoneNumber("");
//				}
//				if(merchant.getMerchantId().equals("")){
//					// 데이터 없음.
//				}
//			}
//		}catch(Exception e){
//			callResult = "F";
//		}

		return callResult;
	}


	/**
	 * RestSelectRemainUserTotalCountBeforeMe
	 *  내 앞에 남은 대기인원수를 가져온다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectRemainUserTotalCountBeforeMe(Merchant merchantParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingUserController";
		methodName = "selectRemainUserTotalCountBeforeMe";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", merchantParam.getMerchantId());
			obj.put("admissionYn", "N");
			obj.put("activateYn", "Y");
			obj.put("numberWaiting", merchantParam.getNumberWaiting());
			obj.put("registerDate", nowDate);
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리

		return callResult;
	}


	/**
	 * RestGetMemberInfo
	 *  개인 정보를 받아와서 도메인에 저장한다
	 * @param memberUserParam 
	 * @return  String
	 */
	public String RestGetMemberInfo(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberController";
		methodName = "selectMemberInformation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("qrCode", memberUserParam.getQrCode());		
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리

		return callResult;
	}


	/**
	 * RestUpdateToServer
	 *  서버로 변경된 설정 등을 업데이트 한다
	 * @param memberUserParam 
	 * @return  String
	 */
	public String RestUpdateToServer(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberController";
		methodName = "updateMemberInformation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("qrCode", memberUserParam.getQrCode());
			obj.put("email", memberUserParam.getEmail());
			obj.put("activateYn", "Y");
			obj.put("modifyDate", nowDate);
			obj.put("deviceType", "AS");	
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리

		return callResult;
	}


	/**
	 * RestUpdateGCMToServer
	 *  서버에 알림 수신 설정 값을 업뎃한다
	 * @param memberUserParam 
	 * @return  String
	 */
	public String RestUpdateGCMToServer(MemberUser memberUserParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberController";
		methodName = "updateReceiveNotificationYn";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("qrCode", memberUserParam.getQrCode());
			obj.put("receiveNotificationYn", memberUserParam.getReceiveNotificationYn());
			obj.put("activateYn", "Y");
			obj.put("modifyDate", nowDate);
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리

		return callResult;
	}


	/**
	 * RestSelectRegisterTeamAndUser
	 *  금일 총 등록팀 수 , 금일 총 등록 인원 가져온다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectRegisterTeamAndUser(Merchant merchantParam){
		
		nowDate = CommonUtils.getNowDate();
		
		// 파라미터 셋팅
		controllerName = "waitingUserController";
		methodName = "selectRegisterTeamAndUser";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", merchantParam.getMerchantId());
			obj.put("registerDate", nowDate);
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();
		
		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);
		
		// 서버 호출 결과 처리
		
		return callResult;
	}
	/**
	 * RestGetWaitingUserList
	 *  대기 중인 고객 목록 가져오는 함수 호출한다
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestGetWaitingUserList(Merchant merchantParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingUserController";
		methodName = "selectUserList";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", merchantParam.getMerchantId());
			obj.put("registerDate", nowDate);
			obj.put("admissionYn", "N");
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리

		return callResult;
	}

	///////////	

	/**
	 * RestSelectDuplicationRecommendation
	 *  가맹점의 추천 여부 확인한다
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectDuplicationRecommendation(WaitingRecommendation waitingRecommendationParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingRecommendationController";
		methodName = "selectDuplicationRecommendation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", waitingRecommendationParam.getMerchantId());
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
			try {
				jsonObject = new JSONObject(callResult);
				String totalCount = jsonObject.getString("totalCount").toString(); 
//				Log. d(TAG,"totalCount:"+totalCount);
				if((totalCount.equals("0"))){
					callResult = "S";		// not exist -> u r first one
				}else{
					callResult = "D";		// already exist. duplicate
				}
//				Log.d(TAG,"callResult:"+callResult);
			} catch (JSONException e) {
				e.printStackTrace();
				callResult = "F";
			} 
			/*
			 * "totalCount":"1",
			 * 
			 */
		}
		return callResult;
	}

	/**
	 * RestRegisterRecommendation
	 *  해당 가맹점에 대한 추천 점수 생성, 및 최초 리뷰 등록한다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestRegisterRecommendation(WaitingRecommendation waitingRecommendationParam, Merchant merchantParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingRecommendationController";
		methodName = "registerRecommendation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 

			//			merchantId
			//			creator

			//			totalMember		
			//			totalEvaluation
			//			averageEvaluation

			//			activateYn
			//			modifyDate
			//			registerDate
			//			+++++++++++++++++++++

			//			memberId
			//			evaluation
			//			content

			//			activateYn
			//			modifyDate
			//			registerDaqte

			obj.put("merchantId", waitingRecommendationParam.getMerchantId());
			obj.put("creator", waitingRecommendationParam.getMemberId());

//			obj.put("totalMember", merchant.getEvaluationCount());	// = "1"
//			obj.put("totalEvaluation", merchant.getEvaluationTotal());	//  = waitingRecommendation.getEvaluation()
//			obj.put("averageEvaluation", merchant.getEvaluationValue());	// = waitingRecommendation.getEvaluation()
			obj.put("totalMember", "1");	// = "1"
			obj.put("totalEvaluation", waitingRecommendationParam.getEvaluation());	//  = waitingRecommendation.getEvaluation()
			obj.put("averageEvaluation", waitingRecommendationParam.getEvaluation());	// = waitingRecommendation.getEvaluation()

			obj.put("memberId", waitingRecommendationParam.getMemberId());
			obj.put("evaluation", waitingRecommendationParam.getEvaluation());
			obj.put("content", waitingRecommendationParam.getContent());
			obj.put("modifyDate", nowDate);
			obj.put("registerDate", nowDate);
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		return callResult;
	}

	/**
	 * RestUpdateRecommendation
	 *  해당 가맹점에 대한 추천 점수 갱신, 및 리뷰 추가 등록한다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestUpdateRecommendation(WaitingRecommendation waitingRecommendationParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingRecommendationController";
		methodName = "updateRecommendation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 

			//			memberId
			//			activateYn
			//			+++++++++++++++++++
			//			merchantId
			//			memberId
			//			evaluation
			//			content
			//			activateYn
			//			modifyDate
			//			registerDate

			obj.put("merchantId", waitingRecommendationParam.getMerchantId());
			obj.put("memberId", waitingRecommendationParam.getMemberId());
			obj.put("evaluation", waitingRecommendationParam.getEvaluation());
			obj.put("content", waitingRecommendationParam.getContent());
			obj.put("modifyDate", nowDate);
			obj.put("registerDate", nowDate);
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
//			//Log. d(TAG,"tempstr:"+tempstr);
			/*
			 *      "result":"SUCCESS"   
			 */
			try {
				jsonObject = new JSONObject(callResult);
				String strResult = jsonObject.getString("result").toString(); 
//				Log. d(TAG,"strResult:"+strResult);
				if((strResult.equals("SUCCESS"))){
					callResult = "S";		// not exist -> u r first one
				}else{
					callResult = "F";		// already exist
				}
			} catch (JSONException e) {
				e.printStackTrace();
				callResult = "F";
			} 
			// WaitingRecommendation
		}
		return callResult;
	}

	//	/**
	//	 * RestUpdateDeactivateRecommendation
	//	 *  추천을 비활성화 한다.
	//	 * @param merchantParam 
	//	 * @return  String
	//	 */
	//	public String RestUpdateDeactivateRecommendation(WaitingRecommendation waitingRecommendationParam){
	//		waitingRecommendation = waitingRecommendationParam;
	//		
	//		nowDate = CommonUtils.getNowDate();
	//		
	//		// 파라미터 셋팅
	//		controllerName = "waitingRecommendationController";
	//		methodName = "updateDeactivateRecommendation";
	//		fullUrl = serverName+"/"+controllerName+"/"+methodName;
	//		JSONObject obj = new JSONObject();
	//		try{		 
	//			obj.put("idRecommendation", waitingRecommendation.getIdRecommendation());
	//			obj.put("merchantId", waitingRecommendation.getMerchantId());
	//			obj.put("memberId", waitingRecommendation.getMemberId());
	//			obj.put("modifyDate", nowDate);
	//			obj.put("activateYn", "Y");
	//		}catch(Exception e){
	//			e.printStackTrace();
	//		}
	//		inputJson = obj.toString();
	//		
	//		// 서버호출 메소드 실행
	//		callResult = callServerMethod(fullUrl, inputJson);
	//		
	//		// 서버 호출 결과 처리
	//		if(callResult.equals("S")){
	//			// WaitingRecommendation
	//		}
	//		return callResult;
	//	}

	/**
	 * RestSelectMerchantRecommendationList
	 *  가맹점의 추천(리뷰) 목록을 가져 온다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectMerchantRecommendationList(WaitingRecommendation waitingRecommendationParam, Context contextParam){
		context = contextParam;
		
		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberRecommendationController";
		methodName = "selectMerchantRecommendationList";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", waitingRecommendationParam.getMerchantId());
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
//		if(callResult.equals("S")){
//			//Log. d(TAG,"tempstr::"+tempstr);
//
//			try {
//				JSONArray jsonArray2 = new JSONArray(tempstr);
//				int max = jsonArray2.length();
//				try {
//					waitingRecommendationEntries = new ArrayList<WaitingRecommendation>(max);
//					/*
//					 * "memberId":"01085858025",
//					 * "evaluation":"6",
//					 * "content":"ㅊㅋ",
//					 * "modifyDate":"2013-07-23 16:44:54",
//					 * "registerDate":"2013-07-23 16:44:54",
//					 */
//					String tmp_memberId = "";
//					String tmpstr2 = "";
//					String tmp_registerDate = "";
//					String tmp_evaluation = "";
//					String tmp_content = "";
//					if(max>0){
//						for ( int i = 0; i < max; i++ ){
//							jsonObject = jsonArray2.getJSONObject(i);
//							//  idCheckMileageMileages,  mileage,  modifyDate,  checkMileageMembersCheckMileageID,  checkMileageMerchantsMerchantID
//							// 객체 만들고 값 받은거 넣어서 저장..  저장값: 인덱스번호, 수정날짜, 아이디, 가맹점아이디.
//							try{
//								tmp_memberId = jsonObject.getString("memberId");
//							}catch(Exception e){
//								tmp_memberId = "";
//							}
//							try{
//								tmp_registerDate = jsonObject.getString("registerDate");
////								if(tmp_registerDate.length()>9){
////									tmpstr2 = tmp_registerDate.substring(0, 4)+ "-" 		// 년
////									+ tmp_registerDate.substring(5, 7)+ "-" 					// 월
////									+ tmp_registerDate.substring(8, 10) 					// 일
////									;
////									tmp_registerDate = tmpstr2;
////								}
//								
//								// 원하는 날짜 형식에 맞춰서 데이터 넣기
//								int dayOfRegisterDate = 0;	// 오전 오후 분간용
//								String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
//								String strAMPM = "";
//								// 오전 오후 분간하기
//								dayOfRegisterDate = Integer.parseInt(tmp_registerDate.substring(11, 13));	// dayOfRegisterDate
//								if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
//									dayOfRegisterDate = dayOfRegisterDate - 12;
//									strAMPM = context.getString(R.string.pm)+"";
//								}else{				// 12시 이전 = 오전
//									strAMPM = context.getString(R.string.am)+"";
//								}
//								// 두자리로 맞추기.
//								dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
//								if(dayOfRegisterDate<10){		
//									dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
//								}
//								tmp_registerDate = 
//									tmp_registerDate.substring(0, 4)+ context.getString(R.string.year) 
//									+tmp_registerDate.substring(5, 7) + context.getString(R.string.month) 
//									+tmp_registerDate.substring(8, 10) + context.getString(R.string.day) 
//									+ " " + strAMPM + " " 
//									+dayOfRegisterDateStr + context.getString(R.string.hour) 
//									+tmp_registerDate.substring(14, 16) + context.getString(R.string.minute) 
//									+tmp_registerDate.substring(17, 19) + context.getString(R.string.seconds);
//								
//							}catch(Exception e){
//								tmp_registerDate = "";
//							}
//							try{
////								tmp_evaluation = jsonObject.getString("evaluation");
//								tmp_evaluation = (int)Float.parseFloat(jsonObject.getString("evaluation"))+"";	// 소수점 제거
//							}catch(Exception e){
//								tmp_evaluation = "0";
//							}
//							try{
//								tmp_content = jsonObject.getString("content");
//							}catch(Exception e){
//								tmp_content = "";
//							}
//							waitingRecommendationEntries.add(new WaitingRecommendation(tmp_memberId,
//									tmp_registerDate,
//									tmp_evaluation,
//									tmp_content
//							));
//						}
//					}
//				}catch (JSONException e) {
//					e.printStackTrace();
//				}
//				waitingRecommendationEntriesFn = waitingRecommendationEntries; 
//			} catch (JSONException e1) {
//				e1.printStackTrace();
//			}
//		}
		return callResult;
	}

	/**
	 * RestSelectMemberRecommendationList
	 *  사용자의 추천 목록을 가져 온다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectMemberRecommendationList(WaitingRecommendation waitingRecommendationParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingRecommendationController";
		methodName = "selectMemberRecommendationList";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("memberId", waitingRecommendationParam.getMemberId());
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		return callResult;
	}

	/**
	 * RestSelectRecommendationTotalCount
	 *  추천 갯수를 가져 온다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectRecommendationTotalCount(WaitingRecommendation waitingRecommendationParam){

		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingRecommendationController";
		methodName = "selectRecommendationTotalCount";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", waitingRecommendationParam.getMerchantId());
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		return callResult;
	}



	/**
	 * RestSelectSearchRecommendationList
	 *    가맹점 리스트를 가져온다. (추천정보를 포함)
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectSearchRecommendationList(MerchantSearchOption merchantSearchOptionParam){
//		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingRecommendationController";
		methodName = "selectSearchRecommendationList";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;				
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("memberId", merchantSearchOptionParam.getMemberId());						//  1. memberId 값이 있으면 내가 방문했던 가맹점, 공백이면 모든 가맹점을 검색 한다.
			obj.put("byTotalMember", merchantSearchOptionParam.getByTotalMember());				//	2. 추천평이 많이 등록된 가맹점순으로 정렬할때는 byTotalMember 값이 'TRUE', 아닐 경우는 공백.
			obj.put("byAverageEvaluation", merchantSearchOptionParam.getByAverageEvaluation());	//	3. 추천점수가 높은 기준으로 정렬할때는 byAverageEvaluation 값이 'TRUE', 아닐 경우는 공백.
			obj.put("companyName", merchantSearchOptionParam.getCompanyName());					//  4. companyName 값으로 상호명을 검색.
			obj.put("businessKind03", merchantSearchOptionParam.getBusinessKind03());				//	5. businessKind03 값으로 업종을 검색.
			obj.put("activateYn", "Y");														// 	6. 추천평이 많이 등록되거나 추천점수가 높은 기준이 아닌 일반적인 경우에는 등록된 순으로 정렬한다.
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
			// WaitingRecommendation
//			Log. d(TAG,"tempstr::"+tempstr);
			/*
			 *tempstr::[
			 *{"idRecommendation":"14",			-- 저장용 - 추천 위해
			 **"creator":"01085858025",			-- 저장용 - 추천 위해
			 *
			 *"merchantId":"car",				-- 가맹점 아이디
			 *"companyName":"일등카센타",			-- 가맹점 이름
			 *"profileImageUrl":"",
			 *"profileThumbnailImageUrl":"",	-- 가맹점 이미지
			 *"totalEvaluation":"6",			-- 총점
			 *"totalMember":"1",				-- 인원
			 *"averageEvaluation":"6",			-- 평점
			 *"workPhoneNumber":null,
			 *]
			 */

//			try {
//				jsonObject = new JSONObject(tempstr);
//				merchant.setMerchantId(jsonObject.getString("merchantId").toString());					// 가맹점 아이디
//
//				try{		// 추천번호
//					merchant.setIdRecommendation(jsonObject.getString("idRecommendation").toString());	
//				}catch(Exception e){
//					merchant.setIdRecommendation("");	
//				}
//				try{		// 최초 추천자
//					merchant.setCreator(jsonObject.getString("creator").toString());
//				}catch(Exception e){
//					merchant.setCreator("");
//				}
//				try{		// 회사명
//					merchant.setCompanyName(jsonObject.getString("companyName").toString());		
//				}catch(Exception e){	
//					merchant.setCompanyName("");
//				}
//				try{		// 이미지
//					merchant.setMerchantImageUrl(jsonObject.getString("profileThumbnailImageUrl").toString());
//				}catch(Exception e){
//					merchant.setMerchantImageUrl("");
//				}
//				try{		// 총점
//					merchant.setEvaluationTotal(jsonObject.getString("totalEvaluation").toString());
//				}catch(Exception e){
//					merchant.setEvaluationTotal("0");
//				}
//				try{		// 추천수
//					merchant.setEvaluationCount(jsonObject.getString("totalMember").toString());
//				}catch(Exception e){
//					merchant.setEvaluationCount("0");
//				}
//				try{		// 평점
//					merchant.setEvaluationValue(jsonObject.getString("averageEvaluation").toString());
//				}catch(Exception e){
//					merchant.setEvaluationValue("0");
//				}
//				
//				//				String totalCount = jsonObject.getString("totalCount").toString(); 
//				//		    	Log. d(TAG,"totalCount:"+totalCount);
//				//		    	if(!(totalCount.equals("0"))){
//				//		    		callResult = "D";		// Duplicate
//				//		    	}
//			} catch (JSONException e) {
//				e.printStackTrace();
//				callResult = "E";
//			} 
//			Log. d(TAG,"callResult:"+callResult);
		}
		return callResult;
	}


	//	/**
	//	 * RestGetMerchantInfo
	//	 *  가맹점 정보를 가져온다.
	//	 * @param merchantParam 
	//	 * @return  String
	//	 */
	//	public String RestGetMerchantInfo(WaitingRecommendation waitingRecommendationParam){
	//		waitingRecommendation = waitingRecommendationParam;
	//		
	//		nowDate = CommonUtils.getNowDate();
	//		
	//		// 파라미터 셋팅
	//		controllerName = "waitingRecommendationController";
	//		methodName = "getMerchantInfo";
	//		fullUrl = serverName+"/"+controllerName+"/"+methodName;
	//		JSONObject obj = new JSONObject();
	//		try{		 
	//			obj.put("merchantId", waitingRecommendation.getMerchantId());
	//			obj.put("activateYn", "Y");
	//		}catch(Exception e){
	//			e.printStackTrace();
	//		}
	//		inputJson = obj.toString();
	//		
	//		// 서버호출 메소드 실행
	//		callResult = callServerMethod(fullUrl, inputJson);
	//		
	//		// 서버 호출 결과 처리
	//		if(callResult.equals("S")){
	//			// WaitingRecommendation
	//		}
	//		return callResult;
	//	}

	/**
	 * RestSelectRecommendationInformation
	 *  가맹점 추천 정보를 가져온다.
	 * @param merchantParam 
	 * @return  String
	 */
	public String RestSelectRecommendationInformation(Merchant merchantParam){

		//		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingRecommendationController";
		methodName = "selectRecommendationInformation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("merchantId", merchantParam.getMerchantId());
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		return callResult;
	}


	/**
	 * RestSelectDuplicationMemberRecommendation
	 *  가맹점 가맹점에 대한 사용자의 추천 여부를 확인한다.
	 * @param waitingRecommendationParam 
	 * @return  String
	 */
	public String RestSelectDuplicationMemberRecommendation(WaitingRecommendation waitingRecommendationParam){

		//		nowDate = CommonUtils.getNowDate();

		// 파라미터 셋팅
		controllerName = "waitingMemberRecommendationController";
		methodName = "selectDuplicationMemberRecommendation";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("memberId", waitingRecommendationParam.getMemberId());
			obj.put("recommendationMerchantId", waitingRecommendationParam.getMerchantId());
			obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
		if(!(callResult.equals("F"))){
			//Log. d(TAG,"tempstr:"+tempstr);		// 20130718-17:19 아직 정보 없음
			// totalCount 값을 꺼내도록 해서, 0이면 최초, 1이상이면 이미 있는 것임.. 0일때 S를 반환하고, 그 외엔 D (Duplicate) 를 반환하도록 할 것.
			// WaitingRecommendation
			try {
				jsonObject = new JSONObject(callResult);
				String totalCount = jsonObject.getString("totalCount").toString(); 
//				Log. d(TAG,"totalCount:"+totalCount);
				if((totalCount.equals("0"))){
					callResult = "S";		// first
				}else{
					callResult = "D";		// Duplicate
				}
//				Log. d(TAG,"callResult:"+callResult);
			} catch (JSONException e) {
				e.printStackTrace();
			} 
		}
		return callResult;
	}


	/**
	 * RestSelectBusinessKindList
	 *  업종 목록을 가져온다.
	 * @param businessKindParam 
	 * @return  String
	 */
	public String RestSelectBusinessKindList(BusinessKind businessKindParam){
		//		nowDate = CommonUtils.getNowDate();
		// 파라미터 셋팅
		controllerName = "waitingBusinessKindController";
		methodName = "selectBusinessKindList";
		fullUrl = serverName+"/"+controllerName+"/"+methodName;
		JSONObject obj = new JSONObject();
		try{		 
			obj.put("countryCode", businessKindParam.getCOUNTRY_CODE());
            obj.put("activateYn", "Y");
		}catch(Exception e){
			e.printStackTrace();
		}
		inputJson = obj.toString();

		// 서버호출 메소드 실행
		callResult = callServerMethod(fullUrl, inputJson);

		// 서버 호출 결과 처리
//		if(callResult.equals("S")){
////			Log.  d(TAG,"tempstr:"+tempstr);		
//			try {
//                JSONArray jsonArray2 = new JSONArray(tempstr);
//                int max = jsonArray2.length();
//                try {
//                    businessKindList = new ArrayList<BusinessKind>(max);
//                    if(max>0){
//                        for ( int i = 0; i < max; i++ ){
//                            JSONObject jsonObject = jsonArray2.getJSONObject(i);
//                            BusinessKind businessKindItem =  new BusinessKind();
//                            try{
//                                businessKindItem.setID_CHECKMILEAGE_BUSINESS_KINDS(jsonObject.getString("idCheckMileageBusinessKind"));
//                            }catch(Exception e){
//                                businessKindItem.setID_CHECKMILEAGE_BUSINESS_KINDS("");
//                            }
//                            try{
//                                businessKindItem.setCONTENT(jsonObject.getString("content"));
//                            }catch(Exception e){
//                                businessKindItem.setCONTENT("");
//                            }
//                            try{
//                                businessKindItem.setCOUNTRY_CODE(jsonObject.getString("countryCode"));
//                            }catch(Exception e){
//                                businessKindItem.setCOUNTRY_CODE("");
//                            }
//                            try{
//                                businessKindItem.setLANGUAGE_CODE(jsonObject.getString("languageCode"));
//                            }catch(Exception e){
//                                businessKindItem.setLANGUAGE_CODE("");
//                            }
//                            businessKindList.add(businessKindItem);
//                        }
//                    }
//                }catch(Exception e){
//                	callResult = "F";	
//                    e.printStackTrace();
//                }
//            }catch(Exception e){
//            	callResult = "F";
//                e.printStackTrace();
//            }
////            Log. d(TAG,"callResult:"+callResult);
//		}
		return callResult;
	}




















































	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	// 공용 서버 호출 메소드
	public String callServerMethod(String fullUrl, String inputJson){
		// 현시각
		nowDate = CommonUtils.getNowDate();
		try{
			URL postUrl = new URL(fullUrl);
			HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();
			connection.setConnectTimeout(CommonConstant.serverConnectTimeOut);
			connection.setDoOutput(true);
			connection.setInstanceFollowRedirects(false);
			connection.setRequestMethod("POST");
			connection.setRequestProperty("Content-Type", "application/json");
			
//			/*
//			 * 방법 1
//			 */
//			writer = new OutputStreamWriter(connection.getOutputStream());
////			writer.write((inputJson.getBytes("UTF-8")).toString());		// class not found exception
//			writer.write(inputJson);									// 정상 동작
//			writer.flush();
//			writer.close();
			/*
			 * 방법 2
			 */
			OutputStream os = connection.getOutputStream();		// 여기서 타임아웃이 발생하는 경우가 있음
			os.write(inputJson.getBytes("UTF-8"));
			os.flush();
			
			responseCode = connection.getResponseCode();
			InputStream in =  connection.getInputStream();
			if(responseCode==200 || responseCode==204){
				// 결과를 처리.
				BufferedReader reader = new BufferedReader(new InputStreamReader(in), 8192);
				StringBuilder builder = new StringBuilder();
				String line =null;
				try {
					while((line=reader.readLine())!=null){
						builder.append(line).append("\n");
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
//				reader.close();
				callResult = builder.toString();
			}else{
//				Log. d(TAG,"Fail["+responseCode+"]");
				callResult="F";
			}
//			os.close();
//			in.close();
		}catch(Exception e){ 
			e.printStackTrace();
			callResult="F";
//			initNetwork();
		}
//		initNetwork();		// @@ 
		isRunning = 0;
		return callResult;
	}	

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////		
	// 처리 결과 반환 메소드


//	// tempstr
//	public String getTempstr(){
//		return tempstr;
//	}
//
//	// merchant
//	public Merchant getMerchant(){		
//		return merchant;
//	}
//	
//	// waitingRecommendation
//	public WaitingRecommendation getWaitingRecommendation(){
//		return waitingRecommendation;
//	}
//	// waitingRecommendationEntriesFn
//	public List<WaitingRecommendation> getWaitingRecommendationEntriesFn(){
//		return waitingRecommendationEntriesFn;
//	}
//	// businessKindList
//	public List<BusinessKind> getBusinessKindList(){
//		return businessKindList;
//	}
	
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸
//	// 넷웍 초기화
//	public void initNetwork(){
//		if(os!=null){
//			os = null;
//		}
//		if(connection!=null){
//			connection.disconnect();
//			connection = null;
//		}
//		postUrl = null;
//	}
}
